{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Isi Penting Generator karangan style"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Generate a long text with karangan style given isi penting (important facts)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\">\n",
    "\n",
    "This tutorial is available as an IPython notebook at [Malaya/example/isi-penting-generator-karangan-style](https://github.com/huseinzol05/Malaya/tree/master/example/isi-penting-generator-karangan-style).\n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-warning\">\n",
    "\n",
    "Results generated using stochastic methods.\n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 2.81 s, sys: 3.92 s, total: 6.73 s\n",
      "Wall time: 1.98 s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/husein/dev/malaya/malaya/tokenizer.py:214: FutureWarning: Possible nested set at position 3397\n",
      "  self.tok = re.compile(r'({})'.format('|'.join(pipeline)))\n",
      "/home/husein/dev/malaya/malaya/tokenizer.py:214: FutureWarning: Possible nested set at position 3927\n",
      "  self.tok = re.compile(r'({})'.format('|'.join(pipeline)))\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "import malaya\n",
    "from pprint import pprint"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### List available HuggingFace"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'mesolitica/finetune-isi-penting-generator-t5-small-standard-bahasa-cased': {'Size (MB)': 242,\n",
       "  'ROUGE-1': 0.24620333,\n",
       "  'ROUGE-2': 0.05896076,\n",
       "  'ROUGE-L': 0.15158954,\n",
       "  'Suggested length': 1024},\n",
       " 'mesolitica/finetune-isi-penting-generator-t5-base-standard-bahasa-cased': {'Size (MB)': 892,\n",
       "  'ROUGE-1': 0.24620333,\n",
       "  'ROUGE-2': 0.05896076,\n",
       "  'ROUGE-L': 0.15158954,\n",
       "  'Suggested length': 1024}}"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "malaya.generator.isi_penting.available_huggingface"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load HuggingFace\n",
    "\n",
    "Transformer Generator in Malaya is quite unique, most of the text generative model we found on the internet like GPT2 or Markov, simply just continue prefix input from user, but not for Transformer Generator. We want to generate an article or karangan like high school when the users give 'isi penting'.\n",
    "\n",
    "```python\n",
    "def huggingface(\n",
    "    model: str = 'mesolitica/finetune-isi-penting-generator-t5-base-standard-bahasa-cased',\n",
    "    force_check: bool = True,\n",
    "    **kwargs,\n",
    "):\n",
    "    \"\"\"\n",
    "    Load HuggingFace model to generate text based on isi penting.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    model: str, optional (default='mesolitica/finetune-isi-penting-generator-t5-base-standard-bahasa-cased')\n",
    "        Check available models at `malaya.generator.isi_penting.available_huggingface`.\n",
    "    force_check: bool, optional (default=True)\n",
    "        Force check model one of malaya model.\n",
    "        Set to False if you have your own huggingface model.\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    result: malaya.torch_model.huggingface.IsiPentingGenerator\n",
    "    \"\"\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading the tokenizer from the `special_tokens_map.json` and the `added_tokens.json` will be removed in `transformers 5`,  it is kept for forward compatibility, but it is recommended to update your `tokenizer_config.json` by uploading it again. You will see the new `added_tokens_decoder` attribute that will store the relevant information.\n",
      "You are using the default legacy behaviour of the <class 'transformers.models.t5.tokenization_t5.T5Tokenizer'>. If you see this, DO NOT PANIC! This is expected, and simply means that the `legacy` (previous) behavior will be used so nothing changes for you. If you want to use the new behaviour, set `legacy=False`. This should only be set if you understand what it means, and thouroughly read the reason why this was added as explained in https://github.com/huggingface/transformers/pull/24565\n"
     ]
    }
   ],
   "source": [
    "model = malaya.generator.isi_penting.huggingface()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### generate\n",
    "\n",
    "```python\n",
    "def generate(\n",
    "    self,\n",
    "    strings: List[str],\n",
    "    mode: str = 'surat-khabar',\n",
    "    **kwargs,\n",
    "):\n",
    "    \"\"\"\n",
    "    generate a long text given a isi penting.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    strings : List[str]\n",
    "    mode: str, optional (default='surat-khabar')\n",
    "        Mode supported. Allowed values:\n",
    "\n",
    "        * ``'surat-khabar'`` - news style writing.\n",
    "        * ``'tajuk-surat-khabar'`` - headline news style writing.\n",
    "        * ``'artikel'`` - article style writing.\n",
    "        * ``'penerangan-produk'`` - product description style writing.\n",
    "        * ``'karangan'`` - karangan sekolah style writing.\n",
    "\n",
    "    **kwargs: vector arguments pass to huggingface `generate` method.\n",
    "        Read more at https://huggingface.co/docs/transformers/main_classes/text_generation\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    result: List[str]\n",
    "    \"\"\"\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Good thing about HuggingFace\n",
    "\n",
    "In `generate` method, you can do greedy, beam, sampling, nucleus decoder and so much more, read it at https://huggingface.co/blog/how-to-generate\n",
    "\n",
    "And recently, huggingface released https://huggingface.co/blog/introducing-csearch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "isi_penting = ['ayam yang sihat dan sejahtera', 'nasi ayam yang sedap dan lazat', 'kedai bernama Husein Nasi Ayam']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "spaces_between_special_tokens is deprecated and will be removed in transformers v5. It was adding spaces between `added_tokens`, not special tokens, and does not exist in our fast implementation. Future tokenizers will handle the decoding process on a per-model rule.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Mutakhir ini, pelbagai berita mengenai penternakan ayam di negara ini hangat '\n",
      " 'diperkatakan di media sosial. Hal ini demikian kerana ayam merupakan sumber '\n",
      " 'protein yang sangat penting dalam kehidupan seharian dan terdapat banyak '\n",
      " 'lemak, lemak dan kalori yang boleh disalurkan secara terus ke dalam badan '\n",
      " 'kita melalui cara yang mudah seperti memasak. Kita perlu sedar bahawa haiwan '\n",
      " 'juga memerlukan sumber makanan yang cukup untuk kelangsungan hidup mereka. '\n",
      " 'Oleh itu, kita perlu mengenal pasti cara-cara untuk memastikan proses '\n",
      " 'penternakan ayam berjalan dengan lancar. Prakarsa utama dalam memastikan '\n",
      " 'penjagaan ayam yang halal adalah dengan memastikan setiap produk yang '\n",
      " 'dihasilkan selamat untuk dimakan. Sebagai contoh, pihak pengeluar telah '\n",
      " 'membuat senarai produk yang menggunakan bahan-bahan yang selamat untuk '\n",
      " 'dimakan, dimana bahan-bahan seperti ayam dan telur sentiasa berada di dalam '\n",
      " 'keadaan yang bersih. Dengan berbuat demikian, pengguna dapat menjamin '\n",
      " 'keselamatan makanan mereka dan kesihatan ayam terjamin. Penyediaan makanan '\n",
      " 'yang selamat dan bersih merupakan satu cara yang baik bagi ayam untuk '\n",
      " 'memastikan tahap kesihatan ayam terjamin dan mempunyai sijil halal. Bak kata '\n",
      " 'peribahasa Melayu, sediakan payung sebelum hujan yang bermaksud kita '\n",
      " 'seeloknya bersedia sebelum hujan. Amalan ini sekurang-kurangnya dapat '\n",
      " 'melahirkan ayam yang sihat dan sejahtera pada masa hadapan. Oleh itu, setiap '\n",
      " 'pihak perlu berganding bahu dalam usaha untuk memastikan ayam yang dimasak '\n",
      " 'memenuhi standard kesihatan diri dan kebersihannya. Terdapat juga cara untuk']\n"
     ]
    }
   ],
   "source": [
    "pprint(model.generate(isi_penting, mode = 'karangan',\n",
    "    do_sample=True, \n",
    "    max_length=256, \n",
    "    top_k=50, \n",
    "    top_p=0.95,))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Dalam era pasca-2020 yang penuh cabaran lantaran pandemik COVID-19, negara '\n",
      " 'telah kehilangan khazanah makanan yang amat bernilai buat rakyat. Ayam '\n",
      " 'merupakan makanan asas yang disediakan untuk penduduk negara yang bergantung '\n",
      " 'kepada kita untuk menghantar makanan ke rumah masing-masing. Oleh itu, kita '\n",
      " 'perlu mengenal pasti cara terbaik untuk menyediakan nasi berlauk yang cukup '\n",
      " 'sedap untuk dimakan bersama-sama. Cara pertama untuk menyediakan nasi '\n",
      " 'berlauk yang cukup sedap adalah dengan membawa makanan tersebut ke dalam '\n",
      " 'mangkuk yang disediakan. Sebaiknya kita membawa makanan tersebut ke dalam '\n",
      " 'mangkuk yang disediakan dan kita perlu mengambil makanan tersebut dengan '\n",
      " 'teliti kerana ia mengandungi zat-zat yang sangat penting untuk kesihatan '\n",
      " 'tubuh badan kita. Antara cara lain untuk menyediakan nasi berlauk yang cukup '\n",
      " 'sedap adalah dengan membawa hidangan makanan tersebut ke dalam mangkuk yang '\n",
      " 'disediakan. Seperti peribahasa Melayu, di mana ada gula, di situ ada semut. '\n",
      " 'Dengan mudahnya kita akan dibawa ke mangkuk makanan yang disediakan oleh ibu '\n",
      " 'dan bapa untuk dimakan bersama-sama. Bagi yang berkemampuan dan mempunyai '\n",
      " 'anak-anak yang saban hari dihidangkan dengan nasi berlauk, kita hendaklah '\n",
      " 'memastikan anak-anak mempunyai selera makan yang seimbang. Ibu bapa juga '\n",
      " 'perlu memastikan anak-anak mempunyai tahap kebersihan yang baik']\n"
     ]
    }
   ],
   "source": [
    "pprint(model.generate(isi_penting, mode = 'karangan',\n",
    "    do_sample=True, \n",
    "    max_length=256, \n",
    "    penalty_alpha=0.8, top_k=4,))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# http://mieadham86.blogspot.com/2016/09/isi-isi-penting-karangan-bahasa-melayu.html\n",
    "# CARA MENJADI MURID CEMERLANG\n",
    "\n",
    "isi_penting = ['Rajin berusaha – tidak mudah putus asa',\n",
    "               'Menghormati orang yang lebih tua – mendapat keberkatan',\n",
    "               'Melibatkan diri secara aktif dalam bidang kokurikulum',\n",
    "               'Memberi tumpuan ketika guru mengajar.',\n",
    "               'Berdisiplin – menepati jadual yang disediakan.',\n",
    "               'Bercita-cita tinggi – mempunyai keazaman yang tinggi untuk berjaya']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[\"'Kejayaan' bukan sahaja dirasai masyarakat di negara ini tetapi seluruh \"\n",
      " 'masyarakat kita di negara ini kerana ia adalah tulang belakang kejayaan '\n",
      " 'kokurikulum yang berjaya. Bukan sahaja dalam kalangan pelajar malah '\n",
      " 'orang-orang tua juga mendapat kejayaan yang sama kerana bangsa kita itu '\n",
      " 'bersatu padu. Namun, apa yang berlaku di negara kita ibarat telur di hujung '\n",
      " 'tanduk, selepas seharian kita melangit akibat daripada salah satu impak '\n",
      " 'negatif daripada kegagalan ini. Jika ditelusuri, kejayaan pelajar '\n",
      " 'terutamanya dalam akademik tidak akan dapat dicapai jika mereka terus '\n",
      " 'cemerlang dalam akademik tanpa sokongan moral. Apa yang lebih membimbangkan, '\n",
      " 'pelajar-pelajar yang cemerlang semakin dipinggirkan kerana tidak mendapat '\n",
      " 'pendidikan yang sempurna. Kesilapan dalam menghafal dan menafsiran mata '\n",
      " 'pelajaran ini mungkin disebabkan mereka tidak bersungguh-sungguh dalam '\n",
      " 'subjek atau program yang disertai. Mereka akan ketagih dan mereka perlu '\n",
      " 'melalui pelbagai cabaran untuk mendapat kejayaan dalam peperiksaan yang '\n",
      " 'disertai. Justeru itu, kita seharusnya mengenali cara-cara agar kejayaan '\n",
      " 'pelajar cemerlang tidak sia-sia. Cara menyinggung perasaan perasaan '\n",
      " 'merupakan amalan mulia yang sering dilakukan oleh masyarakat kita. Antara '\n",
      " 'cara lain untuk meredakan perasaan adalah dengan memberi tumpuan ketika guru '\n",
      " 'mengajar atau mengajar. Dengan cara ini, pelajar bukan sahaja memahami '\n",
      " 'tetapi dapat menilai suasana dan jiwa mereka dengan lebih baik. Guru di '\n",
      " 'sekolah']\n"
     ]
    }
   ],
   "source": [
    "pprint(model.generate(isi_penting, do_sample=True, mode = 'karangan',\n",
    "    max_length=256,\n",
    "    top_k=50, \n",
    "    top_p=0.95, ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Dalam mendepani arus modenisasi hari ini, pelbagai cabaran yang bakal '\n",
      " 'menghambat kemajuan negara pada masa kini. Misalnya, pandemik COVID-19 yang '\n",
      " 'melanda negara telah menyebabkan banyak negara mengalami kemelesetan '\n",
      " 'ekonomi, pengangguran dan juga kadar pengangguran yang tinggi. Namun '\n",
      " 'demikian, terdapat segelintir yang langsung tidak mengambil kisah dan '\n",
      " 'mengambil endah akan nasib yang menimpa negara kita. Sebagai warganegara '\n",
      " 'Malaysia, kita sewajarnya bersyukur dan bertuah kerana mempunyai pelbagai '\n",
      " 'kemudahan dan infrastruktur yang cukup baik disamping mengharungi kehidupan '\n",
      " 'yang sejahtera dan harmoni. Sebagai warganegara Malaysia yang bertuah, kita '\n",
      " 'haruslah mengharumkan nama negara di mata dunia dengan melakukan pelbagai '\n",
      " 'aktiviti yang dapat membantu kita untuk menjadi seorang yang lebih baik. '\n",
      " 'Antara aktiviti yang boleh dilakukan adalah seperti bersukan, sukan, '\n",
      " 'melepak, dan beriadah bersama-sama. Aktiviti ini adalah penting dalam '\n",
      " 'membentuk generasi yang celik teknologi dan mampu menjadi seorang yang lebih '\n",
      " 'baik. Persis peribahasa Melayu, berakit-rakit ke hulu berenang-renang ke '\n",
      " 'tepian, bersakit-sakit dahulu, bersenang-senang kemudian. Aktiviti ini dapat '\n",
      " 'memberikan motivasi kepada kita untuk terus berusaha dalam mencapai kejayaan '\n",
      " 'yang lebih baik. Oleh itu, kita seharusnya bersyukur dengan kemudahan dan '\n",
      " 'infrastruktur yang disediakan oleh Kerajaan Malaysia bagi membantu kita '\n",
      " 'mengatasi']\n"
     ]
    }
   ],
   "source": [
    "pprint(model.generate(isi_penting, mode = 'karangan',\n",
    "    do_sample=True, \n",
    "    max_length=256, \n",
    "    penalty_alpha=0.8, top_k=4,))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
